package com.qfjy.service.impl;

import com.qfjy.entity.po.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName UserServiceImpl
 * @Description TODO
 * @Author guoweixin
 * @Date 2022/3/23
 * @Version 1.0
 */
@Service
@Slf4j
public class UserServiceImpl {
    /**
     * 自动整合配置后提供工具模版类
     *
     * springboot 2.6版本 默认将 RedisTemplate<String,Object>变成  RedisTemplate<Object,Object>
     */
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    //redisTemplate.opsForValue()
    @Resource(name = "redisTemplate")
     private ValueOperations<String,String> string;
    @Resource(name = "redisTemplate")
    private HashOperations<String, String, User> hash;


    public void test(){
        log.info("得到的对象数据："+redisTemplate);

        //存数据
        redisTemplate.opsForValue().set("java2","java2106班级2");

        redisTemplate.expire("key",10, TimeUnit.MINUTES);


       Object result= redisTemplate.opsForValue().get("java2");
        log.info("查询redis的结果是："+result);

    }



    /**
     * Redis有哪些命令，Jedis就有哪些方法，RedisTemplate（是对Jedis功能进行的封装）。
     * RedisTemplate模版方法和Redis命令就不致（但是大体也是相同的）。
     *
     * Redis string类型
     * 案例：
     * 缓存：先来判断Redis缓存中是否存在数据，如果缓存中不存在数据，查询MYSQL数据库，再将MYSQL数据查询的结果存入缓存中。
     */


    public String getString(String key){

        if(redisTemplate.hasKey(key)){
            log.info("查询的是Redis----》");

//           Object result= redisTemplate.opsForValue().get(key);
//            return (String) result;
            return  string.get(key);
        }else{
            log.info("查询的是MYSQL数据库---》");
            String result="学习RedisTemplate";
            redisTemplate.opsForValue().set(key,result);

            return  result;
        }
    }
    /**
     * Redis操作hash类型 (     Redis有什么命令，Jedis有什么方法/RedisTemplate）
     * Hash:特别适合存储一个对象
     案例：根据用户ID查询用户信息对象，
        判断Redis中是否存在，如果存在，直接返回对象
        Redis中如果不存在，查询MYSQL，将查询结果存入Redis中。
     */

    public User selectUserById(String id){

        // key  = "user:"+id    H key, Object hashKey
        if(redisTemplate.opsForHash().hasKey("user",id)){
            log.info("查询的是Redis---》");
//           Object obj= redisTemplate.opsForHash().get("user",id);
//           return (User) obj;
           return hash.get("user",id);

        }else{
            log.info("查询的是MYSQL数据库--》"+id);
            User u=new User();
            u.setId(id);
            u.setName("曾天成");
            u.setRemark("在认真学习Redis");

            //redisTemplate.opsForHash().put("user",id,u);
            hash.put("user",id,u);
            return u;
        }
    }

}
